package com.hyb.algorithm.data.struct.window;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: huyanbing
 * @Date: 2021/8/13 8:45 下午
 * <p>
 * 3. 无重复字符的最长子串
 * 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。
 * <p>
 *  
 * <p>
 * 示例 1:
 * <p>
 * 输入: s = "abcabcbb"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class LengthOfLongestSubstring {

    public static void main(String[] args) {

        String s="pwwkew";

        LengthOfLongestSubstring lengthOfLongestSubstring=new LengthOfLongestSubstring();
        int len=lengthOfLongestSubstring.lengthOfLongestSubstring(s);
        System.out.println(len);
    }


    public int lengthOfLongestSubstring(String s) {

        if(s==null||s.equals("")){
            return 0;
        }

        Map<Character, Integer> windows = new HashMap<>();

        int left = 0;
        int right = 0;

        int maxLen = 0;


        while (right < s.length()) {

            char charRight = s.charAt(right);

            //存入滑动窗口
            windows.put(charRight, windows.getOrDefault(charRight, 0) + 1);
            right++;


            //开始 滑动 left
            while (windows.get(charRight) > 1) {

                char charLeft = s.charAt(left);
                left++;

                windows.put(charLeft, windows.getOrDefault(charLeft, 0) - 1);
            }

            maxLen = Math.max(right - left, maxLen);
        }

        return maxLen;

    }
}
